package org.asiainfo.system.service;

import cn.hutool.core.lang.tree.Tree;

import java.util.List;
import java.util.Set;

import org.asiainfo.system.domain.vo.RouterVo;
import org.asiainfo.system.domain.vo.SysMenuVo;
import org.asiainfo.system.domain.bo.SysMenuBo;
import org.asiainfo.system.domain.SysMenu;
import com.mybatisflex.core.service.IService;

/**
 * 菜单权限表Service接口
 *
 * @author dotor-ww
 */
public interface SysMenuService extends IService<SysMenu> {

    /**
     * 通过menuId查询单条数据
     *
     * @param menuId 主键
     * @return 实例对象
     */
    SysMenuVo queryById(Long menuId);

    /**
     * 新增数据
     *
     * @param sysMenuBo 实例对象
     * @return 实例对象
     */
    Boolean insertByBo(SysMenuBo sysMenuBo);

    /**
     * 修改数据
     *
     * @param sysMenuBo 实例对象
     */
    Boolean updateByBo(SysMenuBo sysMenuBo);

    /**
     * 通过主键删除数据
     *
     * @param menuId 主键
     */
    Boolean deleteWithValidByIds(Long menuId);

    /**
     * 查询用户菜单
     *
     * @param userId 用户ID
     * @return 菜单信息
     */
    List<SysMenu> queryMenuTreeByUserId(Long userId);

    /**
     * 构建前端下拉树结构
     *
     * @param menus 菜单列表
     * @return 下拉结构
     */
    List<RouterVo> buildMenuTree(List<SysMenu> menus);

    /**
     * 根据用户ID查询菜单列表
     *
     * @param sysMenuBo 菜单信息
     * @return 菜单列表
     */
    List<SysMenuVo> selectMenuList(SysMenuBo sysMenuBo);

    /**
     * 构建前端所需要下拉树结构
     *
     * @param menuVos 菜单列表
     * @return 下拉菜单列表
     */
    List<Tree<Long>> buildMenuTreeSelect(List<SysMenuVo> menuVos);

    /**
     * 根据角色ID查询菜单树信息
     *
     * @param roleId 角色ID
     * @return 菜单列表
     */
    List<Long> selectMenuListByRoleId(Long roleId);

    /**
     * 是否存在菜单子节点
     *
     * @param menuId 菜单ID
     * @return 查询结果
     */
    Boolean hasChildMenuByMenuId(Long menuId);

    /**
     * 是否存在角色菜单权限
     *
     * @param menuId 菜单ID
     * @return 查询结果
     */
    Boolean checkMenuExistRole(Long menuId);

    /**
     * 校验菜单名称是否唯一
     *
     * @param sysMenuBo 菜单信息
     * @return 校验结果
     */
    Boolean checkMenuNameUnique(SysMenuBo sysMenuBo);

    /**
     * 租户套餐下的菜单列表
     *
     * @param packageId 租户套餐ID
     * @return 菜单列表
     */
    List<Long> selectMenuListByPackageId(Long packageId);

    /**
     * 根据用户ID查询权限
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    Set<String> selectMenuPermsByUserId(Long userId);
}
